package calculatorv1

import (
	"context"
	"errors"
	"github.com/bufbuild/connect-go" // 新增导入
)

// CalculatorService 结构体：用于实现加减乘除接口
type CalculatorService struct{}

// Add 实现加法接口（修正方法签名）
func (s *CalculatorService) Add(
	ctx context.Context,
	req *connect.Request[AddRequest], // 改为 connect.Request 包装类型
) (*connect.Response[AddResponse], error) {
	resp := connect.NewResponse(&AddResponse{
		Result: req.Msg.A + req.Msg.B, // 通过 req.Msg 获取实际请求数据
	})
	return resp, nil
}

// Subtract 实现减法接口（修正方法签名）
func (s *CalculatorService) Subtract(
	ctx context.Context,
	req *connect.Request[SubtractRequest],
) (*connect.Response[SubtractResponse], error) {
	resp := connect.NewResponse(&SubtractResponse{
		Result: req.Msg.A - req.Msg.B,
	})
	return resp, nil
}

// Multiply 实现乘法接口（修正方法签名）
func (s *CalculatorService) Multiply(
	ctx context.Context,
	req *connect.Request[MultiplyRequest],
) (*connect.Response[MultiplyResponse], error) {
	resp := connect.NewResponse(&MultiplyResponse{
		Result: req.Msg.A * req.Msg.B,
	})
	return resp, nil
}

// Divide 实现除法接口（修正方法签名并处理除零错误）
func (s *CalculatorService) Divide(
	ctx context.Context,
	req *connect.Request[DivideRequest],
) (*connect.Response[DivideResponse], error) {
	if req.Msg.B == 0 {
		// 返回 connect 规范的错误
		return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("division by zero is not allowed"))
	}
	resp := connect.NewResponse(&DivideResponse{
		Result: req.Msg.A / req.Msg.B,
	})
	return resp, nil
}